{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Km42c14entlf"
      },
      "source": [
        "# Домашнее задание. Линейная регрессия\n",
        "В этом домашнем задании вам предстоит написать свой класс линейной регрессии и протестировать его для решения задачи регрессии.\n",
        "\n",
        "Работать мы будем с датасетом пингвинов.\n",
        "#Ссылка на скачивание датасета: [датасет](https://drive.google.com/file/d/1IxN3dR1D6W_hUI656ghr2T3HcolgLsMF/view?usp=share_link)"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "![picture](https://imgur.com/orZWHly.png)"
      ],
      "metadata": {
        "id": "Dk_sNjY0n0dw"
      }
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "KZcvMfgwntlh"
      },
      "source": [
        "## Импорт библиотек и загрузка данных"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "K5jurU4Mntli"
      },
      "source": [
        "Импортируем нужные библиотеки:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "8a2gtsXOntli"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd\n",
        "import matplotlib.pyplot as plt"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "w6oB-SsVntlj"
      },
      "source": [
        "Загрузим датасет:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "F_GhFH9Kntlk",
        "outputId": "edcec1ce-5870-45d4-e778-3976967acd8a",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 206
        }
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "   вид  остров  длина клюва  ширина клюва  длина плавника  масса тела  пол\n",
              "0    0       2         39.1          18.7           181.0      3750.0    1\n",
              "1    0       2         39.5          17.4           186.0      3800.0    0\n",
              "2    0       2         40.3          18.0           195.0      3250.0    0\n",
              "3    0       2         36.7          19.3           193.0      3450.0    0\n",
              "4    0       2         39.3          20.6           190.0      3650.0    1"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-743dcda8-e7eb-48f8-a34e-68e41aa8a99a\" class=\"colab-df-container\">\n",
              "    <div>\n",
              "<style scoped>\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "</style>\n",
              "<table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              "    <tr style=\"text-align: right;\">\n",
              "      <th></th>\n",
              "      <th>вид</th>\n",
              "      <th>остров</th>\n",
              "      <th>длина клюва</th>\n",
              "      <th>ширина клюва</th>\n",
              "      <th>длина плавника</th>\n",
              "      <th>масса тела</th>\n",
              "      <th>пол</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>0</td>\n",
              "      <td>2</td>\n",
              "      <td>39.1</td>\n",
              "      <td>18.7</td>\n",
              "      <td>181.0</td>\n",
              "      <td>3750.0</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>0</td>\n",
              "      <td>2</td>\n",
              "      <td>39.5</td>\n",
              "      <td>17.4</td>\n",
              "      <td>186.0</td>\n",
              "      <td>3800.0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>0</td>\n",
              "      <td>2</td>\n",
              "      <td>40.3</td>\n",
              "      <td>18.0</td>\n",
              "      <td>195.0</td>\n",
              "      <td>3250.0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>0</td>\n",
              "      <td>2</td>\n",
              "      <td>36.7</td>\n",
              "      <td>19.3</td>\n",
              "      <td>193.0</td>\n",
              "      <td>3450.0</td>\n",
              "      <td>0</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>0</td>\n",
              "      <td>2</td>\n",
              "      <td>39.3</td>\n",
              "      <td>20.6</td>\n",
              "      <td>190.0</td>\n",
              "      <td>3650.0</td>\n",
              "      <td>1</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-743dcda8-e7eb-48f8-a34e-68e41aa8a99a')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-743dcda8-e7eb-48f8-a34e-68e41aa8a99a button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-743dcda8-e7eb-48f8-a34e-68e41aa8a99a');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "<div id=\"df-71b92e2d-2cfe-45e5-b09c-43514b6f0c4b\">\n",
              "  <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-71b92e2d-2cfe-45e5-b09c-43514b6f0c4b')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "  </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "  <script>\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() => {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-71b92e2d-2cfe-45e5-b09c-43514b6f0c4b button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  </script>\n",
              "</div>\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "data",
              "summary": "{\n  \"name\": \"data\",\n  \"rows\": 333,\n  \"fields\": [\n    {\n      \"column\": \"\\u0432\\u0438\\u0434\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 2,\n        \"samples\": [\n          0,\n          1,\n          2\n        ],\n        \"num_unique_values\": 3,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u043e\\u0441\\u0442\\u0440\\u043e\\u0432\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 2,\n        \"samples\": [\n          2,\n          0,\n          1\n        ],\n        \"num_unique_values\": 3,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u0434\\u043b\\u0438\\u043d\\u0430 \\u043a\\u043b\\u044e\\u0432\\u0430\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 5.468668342647559,\n        \"min\": 32.1,\n        \"max\": 59.6,\n        \"samples\": [\n          59.6,\n          48.1,\n          46.3\n        ],\n        \"num_unique_values\": 163,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u0448\\u0438\\u0440\\u0438\\u043d\\u0430 \\u043a\\u043b\\u044e\\u0432\\u0430\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 1.9692354633199007,\n        \"min\": 13.1,\n        \"max\": 21.5,\n        \"samples\": [\n          19.5,\n          18.7,\n          17.0\n        ],\n        \"num_unique_values\": 79,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u0434\\u043b\\u0438\\u043d\\u0430 \\u043f\\u043b\\u0430\\u0432\\u043d\\u0438\\u043a\\u0430\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 14.015765288287879,\n        \"min\": 172.0,\n        \"max\": 231.0,\n        \"samples\": [\n          188.0,\n          231.0,\n          224.0\n        ],\n        \"num_unique_values\": 54,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u043c\\u0430\\u0441\\u0441\\u0430 \\u0442\\u0435\\u043b\\u0430\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 805.2158019428965,\n        \"min\": 2700.0,\n        \"max\": 6300.0,\n        \"samples\": [\n          4725.0,\n          3100.0,\n          3575.0\n        ],\n        \"num_unique_values\": 93,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"\\u043f\\u043e\\u043b\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 1,\n        \"samples\": [\n          0,\n          1\n        ],\n        \"num_unique_values\": 2,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 5
        }
      ],
      "source": [
        "data = pd.read_csv('/content/penguins.csv')\n",
        "data.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "cdF741MPntlk"
      },
      "source": [
        "Датасет содержит 7 признаков:\n",
        "\n",
        "- **вид**: вид пингвина. Всего их три разных:\n",
        "  - 0: Adelie\n",
        "  - 1: Chinstrap\n",
        "  - 2: Gento\n",
        "- **остров**: oстров, на котором обитает пингвин. Всего их три разных:\n",
        "  - 0: Biscoe  \n",
        "  - 1: Dream\n",
        "  - 2: Torgersen\n",
        "- **длина клюва**: длина клюва пингвина в миллиметрах;\n",
        "- **ширина клюва**: ширина клюва пингвина в миллиметрах;\n",
        "- **длина плавника**: длина плавника пингвина в миллиметрах;\n",
        "- **масса тела**:\tмасса тела пингвина в граммах;\n",
        "- **пол**: пол пингвина. Всго их два:\n",
        "  - 0: самка\n",
        "  - 1: самец\n",
        "\n",
        "\n",
        "\n"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "##Предобработка данных"
      ],
      "metadata": {
        "id": "HlRHTLeiE4E7"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 0.1. Вызовите метод, описывающий численные признаки датасета:\n"
      ],
      "metadata": {
        "id": "xkl41XcLej27"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "I6e-1AQsejTW"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 0.2. Постройте стоблчатые диаграммы распределения признаков датасета:"
      ],
      "metadata": {
        "id": "QLJUMFRzgK5K"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "0Qopu8d3gRuT"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 1. Воспользуйтесь методом one-hot-encoding для полей остров и вид. ЗАГУГЛИТЬ!"
      ],
      "metadata": {
        "id": "oF-LYujSE__A"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "TB9SaYgCE9iC"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 2. Нормализуйте поля длина клюва, ширина клюва, длина плавника, масса тела (поделить на разницу max-min)"
      ],
      "metadata": {
        "id": "wzgO6I85FPg3"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "IQrSBFzXFbZO"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 3. Отобразите heatmap для данных"
      ],
      "metadata": {
        "id": "Y7jQWjhJWANs"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "33I8tm_4V_xv"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Задача 4. Отобразите scatter plot зависимости переменной длина плавника от переменной длина клюва"
      ],
      "metadata": {
        "id": "rRjUOFtlWOZV"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "QsoX-PYvWaKU"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "### Задача 5. Отобразите scatter plot зависимости переменной длина плавника от переменной ширина клюва"
      ],
      "metadata": {
        "id": "KqqOQcGrWhrl"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "q4CLjUFvWfKO"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 6. Отобразите pair plot для данных"
      ],
      "metadata": {
        "id": "H1v3cv3bW55n"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "Clm_5ZwNXDH8"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 7. Отобразите круговую диаграмму, показывающую отношение объектов по признаку \"остров\""
      ],
      "metadata": {
        "id": "27cfEyf4Xcys"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "5USR_1KlXwqA"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 8. Реализуйте функцию сигмоиды"
      ],
      "metadata": {
        "id": "IWzby-u3ZMZ0"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def sigmoida(x):\n",
        "    # ВАШ КОД ЗДЕСЬ\n",
        "    return y"
      ],
      "metadata": {
        "id": "NQwKC3x9ZLkq"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 9. Обучите модель линейной классификации из sklearn по предсказанию признака \"пол\""
      ],
      "metadata": {
        "id": "WgkwxEumYhu5"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Определим, что будет целевой переменной, а что - признаками:"
      ],
      "metadata": {
        "id": "mJgO60TAZg4e"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "X = # ВАШ КОД ЗДЕСЬ\n",
        "y = # ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "Wa_FOdNnYInz"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Разобьём X и y на train и test: (test_size = 0.15)"
      ],
      "metadata": {
        "id": "69FD-JXOZnzT"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "X_train, X_test, y_train, y_test = # ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "rOil2sE2Z2RR"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Объявим модель и обучим её:"
      ],
      "metadata": {
        "id": "bWaNOrP7aFxP"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.linear_model import LinearRegression\n",
        "\n",
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "sHR5e3cwaQdm"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Получим предсказания модели на тестовых данных:"
      ],
      "metadata": {
        "id": "SC0MpcgDagm6"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "KlD-Ts2TaV0E"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "Посчитаем accuracy - точность предсказания:"
      ],
      "metadata": {
        "id": "EStbKF7vaonS"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "accuracy_score(y_test, y_pred)"
      ],
      "metadata": {
        "id": "x8WtPDp_a1Dn"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "source": [
        "###Задача 10. Отобразите confusion matrix для вашей модели по тестовым данным"
      ],
      "metadata": {
        "id": "xugOp6L_Y4TU"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# ВАШ КОД ЗДЕСЬ"
      ],
      "metadata": {
        "id": "8LIbAMmLZJ7q"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "wzNUZPprntll"
      },
      "source": [
        "И теперь реализуем свой класс линейной регрессии, который затем обучим на датасете:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "jwODGjxDntlm"
      },
      "source": [
        "## Для любознательных. Реализация класса линейной регрессии"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "AuyWYnmzntlm"
      },
      "source": [
        "Ниже — заготовка класса линейной регрессии. Ваша задача — написать код для его методов.\n",
        "\n",
        "Код нужно проверить его на правильность, попробовав обучить свою линейную регрессию на данных пингвинов, которые мы только что загрузили. Код для этого реализован ниже."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FhQoOv-lntln"
      },
      "source": [
        "Несколько комментариев к заданию:\n",
        "- для каждого метода класса (fit, predict) описано, что этот метод принимает на вход и какой функционал реализует. По сути, fit — это аналог метода fit модели линейной регресси из sklearn, predict — аналог метода predict модели линейной регресси из sklearn;\n",
        "- в методе fit при полечении коэффициентов линейной регрессии вам нужно получить две переменные: self.coef_ и self.intercept_. В self.coef_ должен получиться массив коэффициентов, которые модель поставила в соответствие признакам датасета. В self.intercept_ должно получиться одно число — коэффициент-свободный член, который выучила модель. По сути, self.coef_ и self.intercept_ должны быть аналогами этих же переменных модели Linear Regression из sklearn.\n",
        "\n",
        "Алгоритм реализации метода fit:\n",
        "1. Перевести X и y в numpy array (для удобства). Это уже реализовано;\n",
        "2. Добавить к Х первый столбец из единиц. Подсказка: чтобы это сделать, удобно использовать np.hstack. Подумайте, как именно;\n",
        "3. Получить массив коэффициентов k по формуле, которую мы рассматривали в теоретическом видео (2 видео, 16 слайд)\n",
        "4. Разбить полученный массив коэффициентов k на self.coef_ и self.intercept_\n",
        "\n",
        "Алгоритм реализации метода predict:\n",
        "1. Получить значения y_pred, используя значения выученных коэффициентов и входящих признаков Х по формуле, которую мы рассматривали в теоретическом видео (2 видео, 16 слайд)"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "LFmMu95Fntln"
      },
      "outputs": [],
      "source": [
        "class MyLinearRegression:\n",
        "\n",
        "    def __init__(self):\n",
        "\n",
        "        self.coef_ = None\n",
        "        self.intercept_ = None\n",
        "\n",
        "\n",
        "    def fit(self, X, y):\n",
        "        '''\n",
        "        функция обучения линейной регрессии. Аналог метода fit модели LinearRegression из sklearn.\n",
        "        функция принимает на вход обучающую выборку\n",
        "        (Х — матрица признаков, y — массив ответов, значений целевой переменной),\n",
        "        и подбирает кожффициенты линейной регрессии.\n",
        "\n",
        "        входящие параметры:\n",
        "            X: матрица размера (n, f), где n — количество элементов датасета,\n",
        "               f — количество признаков\n",
        "            y: массив размера (n, ), где n — количество элементов датасета\n",
        "        '''\n",
        "        # переведем X и y в формат numpy array,\n",
        "        # чтобы было проще работать\n",
        "        X = np.array(X)\n",
        "        y = np.array(y)\n",
        "\n",
        "        # реализуйте код получения коэффициентов линейной\n",
        "        # регрессии по заданной обучающей выборке Х и y.\n",
        "        # инструкция по реализации дана выше. Не забудьте про\n",
        "        # вектор-столбец из единиц!\n",
        "        <ВАШ КОД ТУТ>\n",
        "\n",
        "        # список коэффициентов, которые модель поставила\n",
        "        # в соответствие признакам датасета.\n",
        "        self.coef_ = <ВАШ КОД ТУТ>\n",
        "        # коэффициент — свободный член.\n",
        "        self.intercept_ = <ВАШ КОД ТУТ>\n",
        "\n",
        "    def predict(self, X):\n",
        "        '''\n",
        "        функция получения предсказания линейной регрессии по входящему массиву признаков Х.\n",
        "\n",
        "        входящие параметры:\n",
        "            X: матрица размера (n, f), где n — количество элементов датасета,\n",
        "               f — количество признаков\n",
        "        '''\n",
        "\n",
        "        y_pred = <ВАШ КОД ТУТ>\n",
        "\n",
        "        return y_pred"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "7JPrhX9kntlo"
      },
      "source": [
        "## Тестирование класса линейной регрессии"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "R8RwiNTKntlp"
      },
      "source": [
        "Давайте протестируем наш самописный класс MyLinearRegression, чтобы убедиться, что мы написали его верно."
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "CsVvXHp3ntlp"
      },
      "source": [
        "### Датасет с одним признаком"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ajQLYw4_ntlr"
      },
      "source": [
        "Сначала протестируем случай, когда у нас всего один признак в данных. Заведем переменные Х и y, и присвоим Х один из столбцов нашего датасета пингвинов. В этот раз давайте будем пытаться предсказывать длину клюва пингвина по его длине плавника."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "oNcr76mGntlr"
      },
      "outputs": [],
      "source": [
        "X = data[['длина плавника']]\n",
        "y = data['длина клюва']"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "sHaO-h4untls"
      },
      "source": [
        "Разобьем Х и y на train и test:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "k2zJ1dpQntlt"
      },
      "outputs": [],
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Y2kpnnPSntlu"
      },
      "source": [
        "И визуализируем точки обучающей выборки:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "RLJ2AufVntlv"
      },
      "outputs": [],
      "source": [
        "# визуализируем точки обучающей выборки\n",
        "plt.scatter(X_train, y_train)\n",
        "\n",
        "# подпишем оси\n",
        "plt.xlabel('длина плавника (мм)');\n",
        "plt.ylabel('длина клюва (мм)');\n",
        "\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "QPnm-4llntlw"
      },
      "source": [
        "Отлично. Теперь объявим и обучим нашу линейную регрессию:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-3ONyDDAntlx"
      },
      "outputs": [],
      "source": [
        "my_lr = MyLinearRegression()\n",
        "my_lr.fit(X_train, y_train)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "tSLN7Lxbntly"
      },
      "source": [
        "И посмотрим, какие у нашей линейной регрессии получились коэффициенты:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "2RqtOgfGntly"
      },
      "outputs": [],
      "source": [
        "my_lr.coef_, my_lr.intercept_"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "033dLM_Wntlz"
      },
      "source": [
        "Теперь мы можем визуализировать прямую, которую описывает наша линейная регрессия. Убедитесь, что ваша линейная регрессия строит прямую, которая адекватно описывает точки (т.е. похожа на правильную)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "YJIVes9entl0"
      },
      "outputs": [],
      "source": [
        "# визуализируем точки обучающей выборки\n",
        "plt.scatter(X_train, y_train)\n",
        "\n",
        "# визуализируем прямую, которую выражает линейная регрессия\n",
        "# y = coef_*x_1 + intercept_\n",
        "def f_line(x):\n",
        "    return  my_lr.coef_*x + my_lr.intercept_\n",
        "\n",
        "x = [np.min(X_train), np.max(X_train)]\n",
        "y = f_line(x)\n",
        "plt.plot(x, y)\n",
        "\n",
        "plt.xlabel('длина плавника (мм)')\n",
        "plt.ylabel('длина клюва (мм)')\n",
        "\n",
        "plt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "j33ROlMmntl1"
      },
      "source": [
        "Хорошо, мы убедились, что наша линейная регрессия как-то работает: выучивает какие-то коэффициенты. Давайте теперь убедимся, что она работает **правильно**. Для этого импортируем линейную регрессию из sklearn, обучим ее на тех же данных и получим ее коэффициенты. Они должны совпадать с теми, что выучивает наша самописная линейная регрессия."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "LmsDTWKjntl1"
      },
      "outputs": [],
      "source": [
        "from sklearn.linear_model import LinearRegression"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Dog-K6E8ntl2"
      },
      "source": [
        "Объявляем модель, обучаем и получаем коэффициенты:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "f9Xshkvjntl3"
      },
      "outputs": [],
      "source": [
        "lr = LinearRegression()\n",
        "lr.fit(X_train, y_train)\n",
        "lr.coef_, lr.intercept_"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ipniXqp1ntl3"
      },
      "source": [
        "Еще раз выведем коэффициенты нашей самописной модели, чтобы сравнить их с теми, что выдает модель из sklearn:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "YphJwUcUntl4"
      },
      "outputs": [],
      "source": [
        "my_lr.coef_, my_lr.intercept_"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "eUDwWv34ntl5"
      },
      "source": [
        "Можно убедиться на глаз, что коэффициенты вашей модели такие же, что у модели из sklearn. Но можно проверить с помощью кода. Код ниже проверяет, что coef_ и inpercept_ вашей модели близки к coef_ и inpercept_ модели из sklearn. Если код ниже не выдает ошибку, то все хорошо. Если выдает ошибку, то ваша модель работает неправильно."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "bsVsEB_sntl5"
      },
      "outputs": [],
      "source": [
        "assert np.allclose(my_lr.coef_, lr.coef_), \"Ошибка: coef_ вашей модели не совпадает с coef_ модели из sklearn!\"\n",
        "assert np.allclose(my_lr.intercept_, lr.intercept_), \"Ошибка: coef_ вашей модели не совпадает с coef_ модели из sklearn!\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "XFHvCb_cntl5"
      },
      "source": [
        "Если ошибок нет, то поздравляю: у вашей линейной регрессии правильно работает метод fit на датасете, в котором один признак =). Проверим теперь работу метода predict. Вызовем predict у my_lr и у lr и сравним ответы:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "MjuhYPU_ntl6"
      },
      "outputs": [],
      "source": [
        "my_y_pred = my_lr.predict(X_test)\n",
        "y_pred = lr.predict(X_test)\n",
        "\n",
        "assert np.allclose(my_y_pred, y_pred), \"Ошибка: метод predict выдает неверные результаты!\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "1V9Z4EFQntl6"
      },
      "source": [
        "Если ячейка отработала без ошибок, поздравляю: ваша линейная регрессия полностью правильно работает на датасете, в котором один признак!\n",
        "    \n",
        "Теперь давайте проверим, что самописная модель также работает на данных, в которых несколько признаков:"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mtdMqWsUntl7"
      },
      "source": [
        "### Датасет с несколькими признаками"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "hsXba6Bsntl7"
      },
      "outputs": [],
      "source": [
        "data.head()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "uCb2Oh1Rntl8"
      },
      "source": [
        "Давайте обучим нашу модель на данных, в которых будут все 6 признаков (все, кроме \"длина клюва\", которая у нас целевая переменная)."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "-CUVoLvhntl8"
      },
      "outputs": [],
      "source": [
        "y = data['длина клюва']\n",
        "X = data.drop(columns=['длина клюва'])"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "dhMqI_eHntl8"
      },
      "source": [
        "Поделим данные на train и test:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "GWVWPW_Gntl9"
      },
      "outputs": [],
      "source": [
        "from sklearn.model_selection import train_test_split\n",
        "\n",
        "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "C6nMavsGntl9"
      },
      "source": [
        "Объявим и обучим самописную линейную регрессию на train части:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "8q6Ejpsrntl9"
      },
      "outputs": [],
      "source": [
        "my_lr = MyLinearRegression()\n",
        "my_lr.fit(X_train, y_train)\n",
        "my_lr.coef_, my_lr.intercept_"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "FsY8mLULntl-"
      },
      "source": [
        "Также объявим и обучим модель из sklearn, чтобы сравнить их:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "h_KRgUyXntl-"
      },
      "outputs": [],
      "source": [
        "lr = LinearRegression()\n",
        "lr.fit(X_train, y_train)\n",
        "lr.coef_, lr.intercept_"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "env93J1-ntl_"
      },
      "source": [
        "Проверка, что coef_ и intercept_ совпадают:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "pRGmEMFQntl_"
      },
      "outputs": [],
      "source": [
        "assert np.allclose(my_lr.coef_, lr.coef_), \"Ошибка: coef_ вашей модели не совпадает с coef_ модели из sklearn!\"\n",
        "assert np.allclose(my_lr.intercept_, lr.intercept_), \"Ошибка: coef_ вашей модели не совпадает с coef_ модели из sklearn!\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "efmIvjNBntl_"
      },
      "source": [
        "И также проверим, что правильно работает метод predict:"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "S0hqO7unntmA"
      },
      "outputs": [],
      "source": [
        "my_y_pred = my_lr.predict(X_test)\n",
        "y_pred = lr.predict(X_test)\n",
        "\n",
        "assert np.allclose(my_y_pred, y_pred), \"Ошибка: метод predict выдает неверные результаты!\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ZK0OQGP8ntmA"
      },
      "source": [
        "Итак, если все ячейки до этого момента отработали без ошибок, поздравляю: кажется, ваша линейная регрессия полностью правильно работает и на датасете, в котором несколько признаков!\n",
        "\n",
        "Вы можете тестировать вашу модель и далее, обучая ее на других датасетах."
      ]
    }
  ]
}